String stringify(int x, int y) {
  return '${x.toString() + " " + y.toString()}';
}

// 在类型后添加 ? 来表示该类型可空
String name = "Jane";
String? address;

void main() {
  print(stringify(3, 2));

  // ??= 赋值运算符，仅当该变量为空值时才为其赋值
  int? a; // = null
  a ??= 3;
  print(a); // <-- Prints 3

  // 另外一个避空运算符是 ??，如果该运算符左边的表达式返回的是空值，则会计算并返回右边的表达式。
  print(1 ?? 3); // <-- Prints 1.
  print(null ?? 12); // <-- Prints 12.

  String? foo = 'a string';
  String? bar; // = null

  String? baz = foo ?? bar;

  void updateSomeVars() {
    // Substitute an operator that makes 'a string' be assigned to bar.
    bar ??= foo;
  }

  // ?. 保护可能会为空的属性的正常访问
  // or null if `str` is null.
  String? upperCaseIt(String? str) {
    // Try conditionally accessing the `toUpperCase` method here.
    return str?.toUpperCase();
  }
}
